//---------------------------------------------------------------------------

#include <vcl.h>
#include "eic.h"
#pragma hdrstop

#include "MTAG_EIC.h"
#include "uSousClasse.h"

#define MODULE_TAG MTAG_USOUSCLASSE
//---------------------------------------------------------------------------

#pragma package(smart_init)

__fastcall TSousClassage::TSousClassage()
{
try
   {
   slFonctions = new TStringList;
   slFonctions->Sort();

   }
catch(Exception &e)
   {
   EICDisplayException(TAG(10), e);
   }
}

__fastcall TSousClassage::~TSousClassage()
{
try
   {
   while (slFonctions->Count)
      DeSousClasser ((HWND)slFonctions->Strings[0].ToInt());

   delete slFonctions;              slFonctions = NULL;
   }
catch(Exception &e)
   {
   EICDisplayException(TAG(20), e);
   }
}

/*******************************************************************************

Fonction :

P.E :

P.E modifiés :

P.S :
*******************************************************************************/
bool __fastcall TSousClassage::SousClasser (HWND HandleASousClasser, WNDPROC Fonction)
{
TMonObjet *sMonObjet = NULL;
int iIndice;
try
   {
   if ((iIndice = slFonctions->IndexOf((long)HandleASousClasser)) == -1)
      {
      sMonObjet = new TMonObjet;
      sMonObjet->Compteur = 1;
      sMonObjet->FonctionSauver = (WNDPROC)SetWindowLong(HandleASousClasser, GWL_WNDPROC, (long)Fonction);

      slFonctions->AddObject((long)HandleASousClasser, (TObject*)sMonObjet);
      }
   else if (((TMonObjet*)slFonctions->Objects[iIndice])->FonctionSauver == Fonction)
      ((TMonObjet*)slFonctions->Objects[iIndice])->Compteur++;
   else //SI la fenêtre est déjà sous-classé et que la fonction a sous-classé n'est pas la même
      return false;
   }
catch(Exception &e)
   {
   EICDisplayException(TAG(30), e);
   }
return true;
}

/*******************************************************************************

Fonction :

P.E :

P.E modifiés :

P.S :
*******************************************************************************/
LRESULT __fastcall TSousClassage::AppelerAncienWindowProc (HWND HandleSousClasser, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
int iIndice;
LRESULT Resultat;
WNDPROC Fct = NULL;
try
   {
   if ((iIndice = slFonctions->IndexOf((long)HandleSousClasser)) != -1)
      {
      Fct = ((TMonObjet*) slFonctions->Objects[iIndice])->FonctionSauver;
      Resultat = CallWindowProc((FARPROC)Fct, HandleSousClasser, uMsg, wParam, lParam);
      }
   }
catch(Exception &e)
   {
   EICDisplayException(TAG(40), e);
   }
return Resultat;
}

/*******************************************************************************

Fonction :

P.E :

P.E modifiés :

P.S :
*******************************************************************************/
void __fastcall TSousClassage::DeSousClasser (HWND HandleSousClasser)
{
int iIndice;
TMonObjet *sMonObjet = NULL;
try
   {
   if ((iIndice = slFonctions->IndexOf((long)HandleSousClasser)) != -1)
      {
      sMonObjet = (TMonObjet*)(slFonctions->Objects[iIndice]);
      sMonObjet->Compteur--;

      if (sMonObjet->Compteur == 0)
         {
         SetWindowLong(HandleSousClasser, GWL_WNDPROC, (long)sMonObjet->FonctionSauver);
         delete sMonObjet;              sMonObjet = NULL;
         slFonctions->Delete(iIndice);
         }
      }
   }
catch(Exception &e)
   {
   EICDisplayException(TAG(50), e);
   }
}

